# -*- coding: utf-8 -*-
"""
LLM 服务配置文件

@author: AI Assistant
"""
import os
import sys
from pathlib import Path
from dotenv import load_dotenv
from loguru import logger

# 加载环境变量
load_dotenv()

# 添加主项目根目录到 Python 路径，以便导入主项目的配置
project_root = Path(__file__).resolve().parent.parent.parent
if str(project_root) not in sys.path:
    sys.path.insert(0, str(project_root))

# ==================== 数据库配置（只读模式） ====================
# 从环境变量读取数据库配置
WATER_DATABASE_URL = os.getenv(
    "WATER_DATABASE_URL",
    "postgresql://postgres:water@10.48.0.85:5432/flood_data_augmentation"
)
logger.info(f"数据库配置加载成功（只读模式）")

# ==================== LLM 配置 ====================
# Ollama 模型服务配置
OLLAMA_CONFIG = {
    "base_url": os.getenv("OLLAMA_BASE_URL", "http://10.48.0.81:11434"),
    "chat_model": os.getenv("OLLAMA_CHAT_MODEL", "qwen3:4b-instruct"),
    "timeout": int(os.getenv("OLLAMA_TIMEOUT", "300")),  # 超时时间（秒）
}

# LLM 生成参数
LLM_GENERATION_CONFIG = {
    "temperature": float(os.getenv("LLM_TEMPERATURE", "0.7")),
    "max_tokens": int(os.getenv("LLM_MAX_TOKENS", "2000")),
    "top_p": float(os.getenv("LLM_TOP_P", "0.9")),
}

# ==================== 水文模型更新 API 配置 ====================
# 水文模型参数更新接口配置
HYDROMODEL_UPDATE_API = {
    "base_url": os.getenv("HYDROMODEL_API_BASE_URL", "https://ws.waterism.tech:8090"),
    "update_endpoint": "/api/update_hydromodel_params",
    "timeout": int(os.getenv("HYDROMODEL_API_TIMEOUT", "30")),  # 超时时间（秒）
}

# ==================== 应用配置 ====================
# 服务配置
SERVICE_CONFIG = {
    "host": os.getenv("LLM_SERVICE_HOST", "0.0.0.0"),
    "port": int(os.getenv("LLM_SERVICE_PORT", "8084")),  # 默认端口改为 8084
    "reload": os.getenv("LLM_SERVICE_RELOAD", "True").lower() == "true",
    "workers": int(os.getenv("LLM_SERVICE_WORKERS", "1")),
}


# ==================== 存储配置 ====================
# CSV 文件存储路径
BASE_STORAGE_PATH = Path(os.getenv("LLM_STORAGE_PATH", str(Path(__file__).parent / "storage")))
CONVERSATION_STORAGE_PATH = BASE_STORAGE_PATH / "conversations"
PARAMETER_STORAGE_PATH = BASE_STORAGE_PATH / "parameters"

# 确保存储目录存在
CONVERSATION_STORAGE_PATH.mkdir(parents=True, exist_ok=True)
PARAMETER_STORAGE_PATH.mkdir(parents=True, exist_ok=True)

# ==================== 日志配置 ====================
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
LOG_FORMAT = os.getenv(
    "LOG_FORMAT",
    "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
)

# 配置 loguru
logger.remove()  # 移除默认处理器
logger.add(
    sys.stderr,
    format=LOG_FORMAT,
    level=LOG_LEVEL,
    colorize=True
)
logger.add(
    BASE_STORAGE_PATH / "logs" / "llm_service_{time:YYYY-MM-DD}.log",
    rotation="00:00",  # 每天午夜轮转
    retention="30 days",  # 保留30天
    level=LOG_LEVEL,
    format=LOG_FORMAT,
    encoding="utf-8"
)

# ==================== 模型配置 ====================
# 水文模型类型映射
HYDROMODEL_TYPES = {
    "dhf": "大伙房模型",
    "xaj": "新安江模型",
    # 可以添加更多模型类型
}

# ==================== 提示词配置 ====================
# 系统提示词基础模板
SYSTEM_PROMPT_BASE = """你是一个水文模型参数调整助手。你的任务是帮助用户通过自然语言对话来修改水文模型的参数。

当前模型信息：
- 模型类型：{model_type}
- 站点代码：{stcd}
- 站点名称：{stcd_name}

{parameter_info}

请遵循以下规则：
1. 理解用户的修改意图，将其转换为具体的参数修改
2. **必须**只返回纯JSON格式，不要添加任何其他文字说明
3. 确保参数值在合理范围内
4. 对参数修改进行解释说明
5. 如果用户请求不明确，请询问确认

**重要**：你的响应必须是一个有效的JSON对象，格式如下：

{{
    "understood": true,
    "message": "你的回复消息",
    "parameter_changes": {{
        "parameters.K": 0.5
    }},
    "explanation": "参数修改的详细说明"
}}

**数据类型要求**：
- 数值参数必须使用数字类型（float/int），不要使用字符串
- 正确：{{"parameters.K": 0.5}}
- 错误：{{"parameters.K": "0.5"}}
- 布尔值使用 true/false，不要使用字符串
- null 值使用 null，不要使用字符串 "null"

示例1 - 成功理解（注意数值类型）：
{{
    "understood": true,
    "message": "好的，我已将表层出流系数K从0.9修改为0.5",
    "parameter_changes": {{
        "parameters.K": 0.5,
        "parameters.A": 3.5
    }},
    "explanation": "表层出流系数K控制表层径流的产生，降低该值会减少表层径流量"
}}

示例2 - 未理解：
{{
    "understood": false,
    "message": "抱歉，我不确定您要修改哪个参数，请问您是要修改K、A还是其他参数？",
    "parameter_changes": null,
    "explanation": "请提供更具体的参数名称"
}}
"""

# ==================== 调试模式 ====================
DEBUG = os.getenv("DEBUG", "False").lower() == "true"

if __name__ == "__main__":
    logger.info(f"数据库连接: {WATER_DATABASE_URL}")
    logger.info(f"Ollama 配置: {OLLAMA_CONFIG}")
    logger.info(f"服务配置: {SERVICE_CONFIG}")
    logger.info(f"对话存储路径: {CONVERSATION_STORAGE_PATH}")
    logger.info(f"参数存储路径: {PARAMETER_STORAGE_PATH}")

